<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: yangweijie <yangweijiester@gmail.com> <code-tech.diandian.com>
// +----------------------------------------------------------------------
namespace Common\Controller;

/**
 * 插件类
 * 
 * @author yangweijie <yangweijiester@gmail.com>
 */
abstract class Addon {
	/**
	 * 视图实例对象
	 * 
	 * @var view
	 * @access protected
	 */
	protected $view = null;
	
	/**
	 * $info = array(
	 * 'name'=>'Editor',
	 * 'title'=>'编辑器',
	 * 'description'=>'用于增强整站长文本的输入和显示',
	 * 'status'=>1,
	 * 'author'=>'thinkphp',
	 * 'version'=>'0.1'
	 * )
	 */
	public $info = array ();
	public $addon_path = '';
	public $config_file = '';
	public $custom_config = '';
	public $admin_list = array ();
	public $custom_adminlist = '';
	public $access_url = array ();
	public function __construct() {
		$this->view = \Think\Think::instance ( 'Think\View' );
		$this->addon_path = ONETHINK_ADDON_PATH . $this->getName () . '/';
		$TMPL_PARSE_STRING = C ( 'TMPL_PARSE_STRING' );
		$TMPL_PARSE_STRING ['__ADDONROOT__'] = __ROOT__ . '/Addons/' . $this->getName ();
		C ( 'TMPL_PARSE_STRING', $TMPL_PARSE_STRING );
		if (is_file ( $this->addon_path . 'config.php' )) {
			$this->config_file = $this->addon_path . 'config.php';
		}
	}
	
	/**
	 * 模板主题设置
	 * 
	 * @access protected
	 * @param string $theme
	 *        	模版主题
	 * @return Action
	 */
	final protected function theme($theme) {
		$this->view->theme ( $theme );
		return $this;
	}
	
	// 显示方法
	final protected function display($template = '') {
		if ($template == '')
			$template = CONTROLLER_NAME;
		echo ($this->fetch ( $template ));
	}
	
	/**
	 * 模板变量赋值
	 * 
	 * @access protected
	 * @param mixed $name
	 *        	要显示的模板变量
	 * @param mixed $value
	 *        	变量的值
	 * @return Action
	 */
	final protected function assign($name, $value = '') {
		$this->view->assign ( $name, $value );
		return $this;
	}
	
	// 用于显示模板的方法
	final protected function fetch($templateFile = CONTROLLER_NAME) {
		if (! is_file ( $templateFile )) {
			$templateFile = $this->addon_path . $templateFile . C ( 'TMPL_TEMPLATE_SUFFIX' );
			if (! is_file ( $templateFile )) {
				throw new \Exception ( "模板不存在:$templateFile" );
			}
		}
		return $this->view->fetch ( $templateFile );
	}
	final public function getName() {
		$class = get_class ( $this );
		return substr ( $class, strrpos ( $class, '\\' ) + 1, - 5 );
	}
	final public function checkInfo() {
		$info_check_keys = array (
				'name',
				'title',
				'description',
				'status',
				'author',
				'version' 
		);
		foreach ( $info_check_keys as $value ) {
			if (! array_key_exists ( $value, $this->info ))
				return FALSE;
		}
		return TRUE;
	}
	
	/**
	 * 获取插件的配置数组
	 */
	final public function getConfig($name = '') {
		static $_config = array ();
		if (empty ( $name )) {
			$name = $this->getName ();
		}
		if (isset ( $_config [$name] )) {
			return $_config [$name];
		}
		$config = array ();
		$map ['name'] = $name;
		$map ['status'] = 1;
		$config = M ( 'Addons' )->where ( $map )->getField ( 'config' );
		if ($config) {
			$config = json_decode ( $config, true );
		} else {
			$temp_arr = include $this->config_file;
			foreach ( $temp_arr as $key => $value ) {
				if ($value ['type'] == 'group') {
					foreach ( $value ['options'] as $gkey => $gvalue ) {
						foreach ( $gvalue ['options'] as $ikey => $ivalue ) {
							$config [$ikey] = $ivalue ['value'];
						}
					}
				} else {
					$config [$key] = $temp_arr [$key] ['value'];
				}
			}
		}
		$_config [$name] = $config;
		return $config;
	}
	
	// 必须实现安装
	abstract public function install();
	
	// 必须卸载插件方法
	abstract public function uninstall();
}
